package com.xk.order.utils;

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConstants;
import com.hy.common.enums.ExceptionEnums;
import com.hy.common.exception.XkException;
import com.xk.order.config.PayConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@Component
public class PayHelper {

    @Autowired
    private WXPay wxPay;
    @Autowired
    private PayConfig config;

    /**
     * 创建订单
     * @param orderId
     * @param totalPay
     * @param desc
     * @return
     */
    public String createOrder(Long orderId, Long totalPay, String desc) {
        try {
            Map<String, String> data = new HashMap<>();
            // 商品描述
            data.put("body", desc);
            // 订单号
            data.put("out_trade_no", orderId.toString());
            // 货币（默认就是人民币）
            //data.put("fee_type", "CNY");
            // 金额 单位是分
            data.put("total_fee", totalPay.toString());
            // 调用微信支付的终端IP
            data.put("spbill_create_ip", "127.0.0.1");
            // 回调地址
            data.put("notify_url", config.getNotifyUrl());
            // 交易类型为扫码支付
            data.put("trade_type", "NATIVE");

            // 利用wxPay工具的unifiedOrder方法， 完成下单
            Map<String, String> result = wxPay.unifiedOrder(data);
            // 判断通信和业务标识(生成url不一定会成功，有可能会失败，所以要判断成功还是失败)
            isSuccess(result);

            //下单成功，获取支付连接
            String url = result.get("code_url");
            return url;
        } catch (Exception e) {
            log.error("【微信下单】创建预交易订单异常失败", e);
            return null;
        }
    }
    /**
     * 判断通信和业务标识
     * @param result
     */
    public void isSuccess(Map<String, String> result) {
        // 判断通信标识
        String returnCode = result.get("return_code");
        if (WXPayConstants.FAIL.equals(returnCode)) {
            // 通信失败
            log.error("【微信下单】微信下单通信失败，失败原因：{}", result.get("return_msg"));
            throw new XkException(ExceptionEnums.WX_PAY_ORDER_FAIL);
        }

        // 判断业务标识
        String resultCode = result.get("result_code");
        if (WXPayConstants.FAIL.equals(resultCode)) {
            // 业务失败
            log.error("【微信下单】微信下单业务失败，错误码：{}，错误原因：{}",
                    result.get("err_code"), result.get("err_code_des"));
            throw new XkException(ExceptionEnums.WX_PAY_ORDER_FAIL);
    }
    }

}
